package com.youlu.campus.web.sign.controller;

import com.youlu.campus.web.config.aspect.ResponseResultBodyType;
import com.youlu.campus.web.sign.dto.*;
import com.youlu.campus.web.sign.service.SignPlanService;
import com.yuelin.infrastructure.quantum.common.QResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

/**
 * 打卡计划控制器
 * 处理打卡计划相关的查询、参与、打卡及统计等操作
 *
 * @author: zgz
 * @date: 2020/8/13 13:36
 */
@RestController
@ResponseResultBodyType
public class SignPlanController {

    @Autowired
    private SignPlanService signPlanService;

    /**
     * 获取打卡详情
     * 根据打卡计划ID查询该计划的详细信息
     * @param signPlanId 打卡计划ID
     * @return 打卡计划详情
     */
    @GetMapping("/mini-app/sign-plan/detail")
    public QResult getSignPanDetail(String signPlanId){
        return QResult.success(signPlanService.getSignPlanDetail(signPlanId));
    }

    /**
     * 获取所有打卡项目列表
     * 查询系统中所有可用的打卡项目
     * @return 所有打卡项目列表
     */
    @GetMapping("/mini-app/sign-plan/all")
    public QResult getAllSignPlan(){
        return QResult.success(signPlanService.getAllSignPlan());
    }

    /**
     * 获取项目参与人列表
     * 分页查询指定打卡计划的参与人信息
     * @param request 参与人列表查询请求参数（包含打卡计划ID及分页信息）
     * @return 参与人分页列表
     */
    @PostMapping("/mini-app/sign-plan/join/list")
    public QResult getSignPlanJoinPage(@RequestBody @Valid SignPlanJoinPageRequest request){
        return QResult.success(signPlanService.getSignPlanJoinPage(request));
    }

    /**
     * 获取最新打卡用户列表
     * 查询指定打卡计划中最新完成打卡的用户列表
     * @param signPlanId 打卡计划ID
     * @return 最新打卡用户列表
     */
    @GetMapping("/mini-app/sign-plan/users")
    public QResult getSignUserList(String signPlanId){
        return QResult.success(signPlanService.getSignUserList(signPlanId));
    }

    /**
     * 获取补卡明细列表
     * 分页查询补卡记录明细
     * @param request 补卡明细查询请求参数
     * @return 补卡明细分页列表
     */
    @PostMapping("/mini-app/sign-plan/patch/list")
    public QResult getSignPatchList(@RequestBody @Valid SignPatchListRequest request){
        return QResult.success(signPlanService.getSignPatchList(request));
    }

    /**
     * 参与打卡计划
     * 用户加入指定的打卡计划
     * @param signPlanId 打卡计划ID
     * @return 参与结果
     */
    @GetMapping("/mini-app/sign-plan/join")
    public QResult joinSignPlan(String signPlanId){
        return QResult.success(signPlanService.joinSignPlan(signPlanId));
    }

    /**
     * 打卡操作
     * 用户完成打卡并提交打卡信息
     * @param request 打卡请求参数（包含打卡计划ID及打卡内容等）
     * @return 打卡结果
     */
    @PostMapping("/mini-app/sign-plan/sign")
    public QResult sign(@RequestBody @Valid SignPlanRequest request){
        return QResult.success(signPlanService.sign(request));
    }

    /**
     * 获取所有参与计划打卡进度
     * 查询当前用户参与的所有打卡计划的进度情况
     * @return 各打卡计划的进度信息
     */
    @GetMapping("/mini-app/sign-plan/join/progress")
    public QResult getSignProgress(){
        return QResult.success(signPlanService.getSignProgress());
    }

    /**
     * 获取打卡列表
     * 分页查询打卡记录列表
     * @param request 打卡列表查询请求参数
     * @return 打卡记录分页列表
     */
    @PostMapping("/mini-app/sign-plan/sign/page")
    public QResult getSignPageList(@RequestBody @Valid SignPageRequest request){
        return QResult.success(signPlanService.getSignPageList(request));
    }

    /**
     * 获取我的打卡记录
     * 分页查询当前用户的打卡记录
     * @param request 打卡记录查询请求参数
     * @return 我的打卡记录分页列表
     */
    @PostMapping("/mini-app/sign-plan/sign/record")
    public QResult getSignRecordList(@RequestBody @Valid SignPageRequest request){
        return QResult.success(signPlanService.getSignRecordList(request));
    }

    /**
     * 获取打卡详情
     * 根据打卡记录ID查询该次打卡的详细信息
     * @param id 打卡记录ID
     * @return 打卡详情
     */
    @GetMapping("/mini-app/sign-plan/sign/detail")
    public QResult getSignDetail(String id){
        return QResult.success(signPlanService.getSignDetail(id));
    }

    /**
     * 打卡统计
     * 查询指定打卡计划的打卡数据统计（如总打卡次数、参与人数等）
     * @param signPlanId 打卡计划ID
     * @return 打卡统计数据
     */
    @GetMapping("/mini-app/sign-plan/sign/count")
    public QResult getSignPlanCount(String signPlanId){
        return QResult.success(signPlanService.getSignPlanCount(signPlanId));
    }

}